#!/usr/bin/python3
# -*- coding: utf-8 -*-

#基本数据类型
print('基本数据类型')
counter = 100          # 整型变量
miles   = 1000.0       # 浮点型变量
name    = "runoob"     # 字符串
 
print (counter)
print (miles)
print (name)
print()


print('多个变量赋值')
# 多个变量赋值
a = b = c = 1
print(b);
print()

print('分别赋值')
# 分别赋值
a, b, c = 1, 2, "runoob"
print(b);
print()


# 标准数据类型
print('标准数据类型')
## Number（数字）int、float、bool、complex（复数）
a, b, c, d = 20, 5.5, True, 4+3j
print(type(a), type(b), type(c), type(d))
print()

## 数值运算
print('数值运算')
print(1+True)
print(1+False)
print(5 + 4) # 加法
print(4.3 - 2) # 减法
print(3 * 7) # 乘法
print(2 / 4) # 除法，得到一个浮点数
print(3 // 4) # 除法，得到一个整数，舍去法
print(17 % 3) # 取余
print(2 ** 5) # 乘方

## 各进制
print('各进制')
print(0b11) # 二进制
print(0o11) # 八进制
print(11)	# 十进制
print(0x11) # 十六进制
print()


## String（字符串）用单引号 ' 或双引号 " 括起来，同时使用反斜杠 \ 转义特殊字符
## 加号 + 是字符串的连接符， 星号 * 表示复制当前字符串，紧跟的数字为复制的次数
## 反斜杠可以用来转义，使用r可以让反斜杠不发生转义。
## Python中的字符串有两种索引方式，从左往右以0开始，从右往左以-1开始。
## Python中的字符串不能改变。'abcd'[0] = 'm'会导致错误
print('String（字符串）')

print('aa'+'bb')	#aabb
print("ab"*2)		#abab
print('abcd'[0:1])	#a 截取下标0到1(不包含1)的字符串
print('abcd'[0:-1])	#abc 截取下标0到-1(倒数第一,不包含1)的字符串
print('abcd'[1])	#a 输出下标为1的字符串
print('ab\ncd')		#转义
print(r'ab\ncd')	#不转义
print()


## List（列表） 写在方括号 [] 之间、用逗号分隔开的元素列表
## List写在方括号之间，元素用逗号隔开。
## 和字符串一样，list可以被索引和切片。
## List可以使用+操作符进行拼接。
## List中的元素是可以改变的。List[0] = 'b'
print('List（列表）')

list = ['a',2,'c',['d','f']]
tinylist = [123,'runoob']
print(list)				# 输出完整列表
print(list[0])			# 输出列表下标0的元素
print(list[2:])			# 输出列表下标2以后的元素
print(list[1:3])		# 输出列表下标1到3的元素(不包含3)
print(tinylist * 2)		# 输出两次列表
print(list + tinylist)	# 连接列表
print()


## Tuple（元组）写在小括号 () 里，元素之间用逗号隔开。
## 元组（tuple）与列表类似，不同之处在于元组的元素不能修改。tuple[0] = 'b'报错
print('Tuple（元组）')
tuple = ('abcd',786 ,2.23,'runoob',70.2)
tinytuple = (123,'runoob')

print (tuple)             # 输出完整元组
print (tuple[0])          # 输出元组下标0的元素
print (tuple[1:3])        # 输出元组下标1到3的元素
print (tuple[2:])         # 输出元组下标2以后的元素
print (tinytuple * 2)     # 输出两次元组
print (tuple + tinytuple) # 连接元组
print()


## Set（集合） 可以使用大括号 { } 或者 set() 函数创建集合，
## 创建一个空集合必须用 set() 而不是 { }，因为 { } 是用来创建一个空字典
print('Set（集合）')
student = {'Tom', 'Jim', 'Mary', 'Tom', 'Jack', 'Rose'}
print(student)	# 输出集合，重复的元素被自动去掉

# 成员测试
if 'Rose' in student :
    print('Rose 在集合中')
else :
    print('Rose 不在集合中')

# set可以进行集合运算
print('集合运算')
a = set('aabbccdd')
b = set('adhg')

print(a)
print(a - b)     # a 和 b 的差集
print(a | b)     # a 和 b 的并集
print(a & b)     # a 和 b 的交集
print(a ^ b)     # a 和 b 中不同时存在的元素
print()


## Dictionary（字典）
## 列表是有序的对象集合，字典是无序的对象集合。
## 两者之间的区别在于：字典当中的元素是通过键来存取的，而不是通过偏移存取。
## 字典是一种映射类型，字典用"{ }"标识，它是一个无序的键(key) : 值(value)对集合。
## 键(key)必须使用不可变类型。
## 在同一个字典中，键(key)必须是唯一的 重复的会被后面的覆盖
print('Dictionary（字典）')

dict = {}
dict['one'] = "1 - 菜鸟教程"
dict[2]     = "2 - 菜鸟工具"
 
tinydict = {'name': 'runoob','code':1, 'site': 'www.runoob.com'}
 
 
print (dict['one'])       # 输出键为 'one' 的值
print (dict[2])           # 输出键为 2 的值
print (tinydict)          # 输出完整的字典
print (tinydict.keys())   # 输出所有键
print (tinydict.values()) # 输出所有值